package com.zzyl.service;

import com.zzyl.base.PageBean;
import com.zzyl.dto.ReservationDto;
import com.zzyl.dto.VisitDto;
import com.zzyl.entity.visit.Visit;
import com.zzyl.vo.ReservationVo;
import com.zzyl.vo.TimeCountVo;

import java.time.LocalDateTime;
import java.util.List;

public interface ReservationService {
	/**
	 * 添加预约信息
	 * @param dto 预约信息
	 */
	void add(ReservationDto dto);
	
	/**
	 * 更新预约信息
	 * @param id  预约信息id
	 * @param dto 预约信息
	 */
	void update(Long id, ReservationDto dto);
	
	/**
	 * 取消预约
	 */
	void cancelReservation(Long id);
	
	/**
	 * 根据id删除预约信息
	 * @param id 预约信息id
	 */
	void deleteById(Long id);
	
	/**
	 * 根据id查找预约信息
	 * @param id 预约信息id
	 * @return 预约信息
	 */
	ReservationVo findById(Long id);
	
	/**
	 * 查找所有预约信息
	 * @param mobile
	 * @param time
	 * @return 所有预约信息
	 */
	List<ReservationVo> findAll(String mobile, LocalDateTime time);
	
	/**
	 * 分页查找预约信息
	 * @param page      页码
	 * @param size      每页大小
	 * @param name      预约人姓名
	 * @param phone     预约人手机号
	 * @param status    预约状态
	 * @param type      预约类型
	 * @param startTime
	 * @param endTime
	 * @return 预约信息列表
	 */
	PageBean<ReservationVo> findByPage(int page, int size, String name, String phone, Integer status, Integer type, LocalDateTime startTime, LocalDateTime endTime);
	
	
	/**
	 * 如果预约未完成，则将预约状态更新为取消
	 * @param id 预约信息id
	 */
	void updateVisitReservationStatusToExpiredIfNotCompleted(Long id);
	
	/**
	 * 查询每个时间段剩余预约次数
	 * @param of 时间 日
	 * @return 每个时间段剩余预约次数
	 */
	public List<TimeCountVo> countReservationsForEachTimeWithinTimeRange(LocalDateTime of);
	
	/**
	 * 取消预约次数的接口
	 * @param updateBy 预约人
	 * @return 取消预约次数
	 */
	int getCancelledReservationCount(Long updateBy);
	
	/**
	 * 来访
	 * @param id   ID
	 * @param time 时间
	 */
	void visit(Long id, Long time);
	
	void updateReservationStatus(LocalDateTime now);
	/**
	 * 取消预约
	 */
	Object cancelledCount();

	List<TimeCountVo> countByTime(Long time);

	void postCount(Visit visit);


	PageBean<ReservationVo> pageCount(Integer pageNum, Integer pageSize, Integer status);

	void clearCount(Long id);
}
